package GUILag;

import ControllerLag.LockerCTR;
import ModelLag.Locker;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * GUI - Panel til styring af CRUD locker funktionaliteter.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class AdmLockerPanel extends javax.swing.JPanel {
    
    private LockerCTR lockerCtr;

    /** Creates new form AdmLockerPanel */
    public AdmLockerPanel() {
        initComponents();
        
        lockerCtr = new LockerCTR();
        
        // Indsætter data i tabellen i GUI.
        updateLockerTable();
    }
    
     /**
     * Henter den model som bruges i netbeans GUI, så man kan sætte properties ved
     * at højreklikke på tabellen i IDE. Man slipper derved for at skrive det i koden
     * eller at skulle lave sin egen tablemodel.
     * @return Tablemodel som bruges.
     */    
    private DefaultTableModel getModel()
    {
        return (DefaultTableModel) lockerTable.getModel();
    }

    
    /**
     * Bruges til at tilføje en række til modellen/tabellen. Derefter tilføjer den
     * det data som er med som parameter. Når der tilføjes noget til modellen, så
     * opdateres tabellen automatisk. 
     * @param lockerID SkabID på lcoker.
     * @param available Status på locker.
     * @param depositum Depositum på locker.
     * @param pricePrYear PrisPrÅr på locker.
     * @param amountOfKeys AntalNølger på locker.
     * @param lockerType SkabsType på locker.
     * @param sort Bestemmer om modellen skal sorteres i 0. kolonne.
     */    
    private void addRowAndData(int lockerID, int available, double depositum, double pricePrYear, int amountOfKeys, String lockerType, boolean sort)
    {
        Object[] data = {lockerID, available, depositum, pricePrYear, amountOfKeys, lockerType};
        getModel().addRow(data);
    
        if(sort)
        {
            sortTable();
        }
    }
    
    /**
     * Sortering af tabellen (den man ser) efter 0.kolonne. Sortere IKKE modellen.
     */    
    private void sortTable()
    {
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(getModel());
        List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
        sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
        sorter.setSortKeys(sortKeys);
        lockerTable.setRowSorter(sorter);
    }
    
    /**
     * Henter alle lockers og gemmer dem i en midlertidig ArrayList. I denne ArrayList
     * tages hvert element og så hentes der SkabID, Status, Depositum, PrisPrÅr, AntalNølger og SkabsType.
     * Derefter tilføjes disse til modellen og dermed til tabellen.
     */    
    private void updateLockerTable()
    {
        ArrayList<Locker> lockers = lockerCtr.getAllLockers();

        int lockerID;
        int available;
        double depositum;
        double pricePrYear;
        int amountOfKeys;
        String lockerType;
        
        
        
        for(Locker lockerObj : lockers)
        {   
            lockerID = lockerObj.getLockerID();
            available = lockerObj.getAvailable();
            depositum = lockerObj.getDepositum();
            pricePrYear = lockerObj.getPricePrYear();
            amountOfKeys = lockerObj.getAmountOfKeys();
            lockerType = lockerObj.getLockerType();

            addRowAndData(lockerID, available, depositum, pricePrYear, amountOfKeys, lockerType, false);
        }
    } 
    
    /**
     * Sletter en række alt efter rækkenr i tabellen. Den konvertere først rækkenr
     * i tabellen til tilsvarende rækkenr i modellen da disse kan være forskellige
     * pga. at sorteringen foregår i tabellen og ikke i modellen. Derefter slettes
     * rækken i modellen og dermed i tabellen.
     * @param rowNo Rækkenr i tabellen som skal slettes. 
     */    
    private void removeRow(int rowNo)
    {
        rowNo = lockerTable.convertRowIndexToModel(rowNo);
        getModel().removeRow(rowNo);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */      
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        createLockerButton = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        lockerTable = new javax.swing.JTable();
        deleteLockerButton = new javax.swing.JButton();
        updateLockerButton = new javax.swing.JButton();

        createLockerButton.setText("Opret skab");
        createLockerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createLockerButtonActionPerformed(evt);
            }
        });

        lockerTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Skab ID", "Status", "Depositum", "Pris pr år", "Udlev. nøgler", "Skabs type"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.Integer.class, java.lang.Double.class, java.lang.Double.class, java.lang.Integer.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        lockerTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        lockerTable.getTableHeader().setReorderingAllowed(false);
        jScrollPane1.setViewportView(lockerTable);

        deleteLockerButton.setText("Slet skab");
        deleteLockerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteLockerButtonActionPerformed(evt);
            }
        });

        updateLockerButton.setText("Opdater skab");
        updateLockerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                updateLockerButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(createLockerButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 539, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(updateLockerButton)
                        .addGap(18, 18, 18)
                        .addComponent(deleteLockerButton)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(createLockerButton)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(updateLockerButton)
                    .addComponent(deleteLockerButton))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Her oprettes et locker ved hjælp af JOptionPane hvor der er 6 textfields,
     * hvor de forskellige data bliver indsat.
     * rc = 1. Oprettelsen gik godt i databasen.
     * rc -1. Fejl ved oprettelse i databasen. 
     */
    private void createLockerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createLockerButtonActionPerformed
        JTextField lockerIDField = new JTextField();
        JTextField depositumField = new JTextField();
        JTextField pricePrYearField = new JTextField();
        JTextField amountOfKeysField = new JTextField();
        JComboBox lockerType = new JComboBox<String>();
        lockerType.addItem("S");
        lockerType.addItem("L");

        
        // Strings og JTexFields som skal vises i JOptionpane.
        Object[] message = new Object[] {"Skabs ID:", lockerIDField, "Depositum:", depositumField, "Pris pr år:", pricePrYearField, "Antal nøgler:", amountOfKeysField, "Skab type:", lockerType};
        
        //En anden form for JOptionpane.
        //int input = JOptionPane.showConfirmDialog(this, message, "Opret ny skab", JOptionPane.OK_CANCEL_OPTION); HER er OK Knappen i fokus fra start!
        
        //Knapper på JOptionpane, som der har knapperne "OK" og "Annuller".
        Object[] options = {"OK", "Annuller"};
        
        int input = JOptionPane.showOptionDialog(this, message, "Opret ny skab", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "");
        
        if(input == JOptionPane.OK_OPTION)
        {
            if (lockerIDField.getText().length() > 0)
            {
                try
                {
                 int rc = lockerCtr.createLocker(Integer.parseInt(lockerIDField.getText()), 0, Double.parseDouble(depositumField.getText()), Double.parseDouble(pricePrYearField.getText()), Integer.parseInt(amountOfKeysField.getText()), (String)lockerType.getSelectedItem());
                
                
                // rc = return code
                if(rc == 1)
                {
                    addRowAndData(Integer.parseInt(lockerIDField.getText()), 0, Double.parseDouble(depositumField.getText()), Double.parseDouble(pricePrYearField.getText()), Integer.parseInt(amountOfKeysField.getText()), (String)lockerType.getSelectedItem(), true);
                    JOptionPane.showMessageDialog(this, "Skabet "+ Integer.parseInt(lockerIDField.getText()) + " er nu oprettet", "Oprettelse lykkedes", JOptionPane.INFORMATION_MESSAGE);
                    
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "Der er opstået en fejl. Skabet" + Integer.parseInt(lockerIDField.getText()) + " eksisterer muligvis i forvejen.", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
                }
                
            catch(NumberFormatException e)
            {
                JOptionPane.showMessageDialog(this, "Der må kun indtastes tal i felterne.", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
            }
        }
        }
    }//GEN-LAST:event_createLockerButtonActionPerformed

    // locker opdateres ved hjælp af den markerede række i tabellen hvor lockerID bruges til opdatering.
    // rc = 1. Opdatering gik godt i databasen.
    // rc = -1. Opdatering mislykkedes.    
    private void updateLockerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateLockerButtonActionPerformed
        int rowSelected = lockerTable.getSelectedRow();

        if(rowSelected == -1)
        {
            JOptionPane.showMessageDialog(this ,"vælg skabet som skal opdateres.", "Vælg medarbejderen", JOptionPane.INFORMATION_MESSAGE);
        }
        else
        {

            int lockerID = (Integer) lockerTable.getValueAt(rowSelected, 0);
            int available = (Integer) lockerTable.getValueAt(rowSelected, 1);
            double depositum = (Double) lockerTable.getValueAt(rowSelected, 2);
            double pricePrYear = (Double) lockerTable.getValueAt(rowSelected, 3);
            int amountOfKeys = (Integer) lockerTable.getValueAt(rowSelected, 4);
            String lockerType = (String) lockerTable.getValueAt(rowSelected, 5);
            
            JTextField availableField = new JTextField("" + available);
            availableField.setEnabled(false);
            JTextField depositumField = new JTextField("" + depositum);
            JTextField pricePrYearField = new JTextField("" + pricePrYear);
            JTextField amountOfKeysField = new JTextField("" + amountOfKeys);
            
            JComboBox lockerTypeCombo = new JComboBox<String>();
            lockerTypeCombo.addItem("S");
            lockerTypeCombo.addItem("L");
            
            if(lockerType.equals("L"))
            {
                lockerTypeCombo.setSelectedIndex(1);
            }
            
            
            Object[] message = new Object[] {"Skab ID: " + lockerID, "Status:", availableField, "Depositum:", depositumField, "Pris pr år:", pricePrYearField, "Antal nøgler:", amountOfKeysField, "Skabs type:", lockerTypeCombo};       
            Object[] options = { "Opdater", "Annuller"};
            
            //Bruges for at få fokus i det første textfield i JOptionpanet.
            int input = JOptionPane.showOptionDialog(this, message, "Opdatering af medarbejder", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "");
            
            if(input == JOptionPane.OK_OPTION)
            {
                try
                {
                   available = Integer.parseInt(availableField.getText());
                   depositum = Double.parseDouble(depositumField.getText());
                   pricePrYear = Double.parseDouble(pricePrYearField.getText());
                   amountOfKeys = Integer.parseInt(amountOfKeysField.getText());
                   lockerType = (String)lockerTypeCombo.getSelectedItem();  
                
                
                if(availableField.getText().length() > 0)
                {
                   
                    int rc = -1;
                    try
                    {
                        rc = lockerCtr.updateLocker(lockerID, available, depositum, pricePrYear, amountOfKeys, lockerType);
                    }
                    catch(Exception e)
                    {
                        
                    }
                    if(rc == 1)
                    {
                        lockerTable.setValueAt(lockerID, rowSelected, 0);
                        lockerTable.setValueAt(available, rowSelected, 1);
                        lockerTable.setValueAt(depositum, rowSelected, 2);
                        lockerTable.setValueAt(pricePrYear, rowSelected, 3);
                        lockerTable.setValueAt(amountOfKeys, rowSelected, 4);
                        lockerTable.setValueAt(lockerType, rowSelected, 5);

                        JOptionPane.showMessageDialog(this, "Skabet er opdateret.", "Opdatering lykkedes", JOptionPane.INFORMATION_MESSAGE);  
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(this, "En fejl er opstået.", "Opdatering mislykkedes", JOptionPane.ERROR_MESSAGE);
                    }
                }
                }
                catch(NumberFormatException e)
                {
                    JOptionPane.showMessageDialog(this, "Der skal indtastet de rigtige data.", "Oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
        
        }
    }//GEN-LAST:event_updateLockerButtonActionPerformed

    // lcoker slettes ved hjælp af den markerede række i tabellen hvor lockerID bruges til sletning.
    // rc = 1. Sletning gik godt i databasen.
    // rc = -1. Sletning mislykkedes.    
    private void deleteLockerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteLockerButtonActionPerformed
        int rowSelected = lockerTable.getSelectedRow();
        
        if(rowSelected != -1)
        {
            int lockerID = (Integer) lockerTable.getValueAt(rowSelected, 0);

            int input = JOptionPane.showConfirmDialog(this, "er du sikker på at du vil slette dette skab: " + lockerID + "?", "Bekræft sletning", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
            if(input == JOptionPane.OK_OPTION)
            {
                int rc = lockerCtr.deleteLocker(lockerID);
                
                if(rc == 1)
                {
                    removeRow(rowSelected);
                    JOptionPane.showMessageDialog(this, "skabet er nu slettet", "sletning lykkedes", JOptionPane.INFORMATION_MESSAGE);
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "En fejl er opstået.", "Sletning mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        else
        {
            JOptionPane.showMessageDialog(this, "Vælg den kunde som skal slettes.", "Vælg et skab", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_deleteLockerButtonActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton createLockerButton;
    private javax.swing.JButton deleteLockerButton;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable lockerTable;
    private javax.swing.JButton updateLockerButton;
    // End of variables declaration//GEN-END:variables
}
